JavaScriptã³ãŒãå質ããã·ã¥ããŒããæ§ç¯ããäž»èŠãªã¡ããªã¯ã¹ãå¯èŠåãããã¬ã³ãã远跡ããã³ãŒãããŒã¹ãæ¹åããæ¹æ³ãåŠã³ãŸãã
JavaScriptã³ãŒãå質ããã·ã¥ããŒãïŒã¡ããªã¯ã¹ãå¯èŠåãããã³ãã¬ã³ãåæ
仿¥ã®æ¥éã«å€åãããœãããŠã§ã¢éçºç°å¢ã§ã¯ãä¿¡é Œæ§ãé«ããã¹ã±ãŒã©ãã«ã§ãä¿å®æ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«ãé«ãã³ãŒãå質ãç¶æããããšãäžå¯æ¬ ã§ããJavaScriptã³ãŒãå質ããã·ã¥ããŒãã¯ãäž»èŠãªã¡ããªã¯ã¹ã®éäžãã¥ãŒãæäŸããéçºããŒã ãé²è¡ç¶æ³ã远跡ããæœåšçãªåé¡ãç¹å®ããããŒã¿ã«åºã¥ããæææ±ºå®ãè¡ã£ãŠã³ãŒãããŒã¹ãæ¹åã§ããããã«ããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãã³ãŒãå質ããã·ã¥ããŒãã䜿çšããã¡ãªããã远跡ãã¹ãéèŠãªã¡ããªã¯ã¹ãããã³äžè¬çãªããŒã«ãšãã¯ããã¯ã䜿çšããŠããã·ã¥ããŒããå®è£ ããå®éçãªäŸã«ã€ããŠèª¬æããŸãã
JavaScriptã³ãŒãå質ããã·ã¥ããŒããå®è£ ããçç±
é©åã«èšèšãããã³ãŒãå質ããã·ã¥ããŒãã«ã¯ãããã€ãã®éèŠãªå©ç¹ããããŸãã
- ã³ãŒãã®ä¿å®æ§ã®åäžïŒ 埪ç°çè€é床ãã³ãŒãã®éè€ãªã©ã®ã¡ããªã¯ã¹ã远跡ããããšã«ãããããŒã ã¯çè§£ãšä¿å®ãé£ããé åãç¹å®ããã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããŠç°¡çŽ åã§ããŸãã
- æè¡çè² åµã®åæžïŒ ããã·ã¥ããŒãã¯ãã³ãŒãã®èããè匱æ§ããã®ä»ã®æè¡çè² åµã®åé¡ã匷調ããããŒã ãããæ·±å»ãªåé¡ã«ã€ãªããåã«ãããããåªå ããŠå¯ŸåŠã§ããããã«ããŸãã
- ã³ãŒãã®ã»ãã¥ãªãã£ã®åŒ·åïŒ æ¢ç¥ã®è匱æ§ãã»ãã¥ãªãã£ãããã¹ãããã®æ°ãªã©ã®ã»ãã¥ãªãã£é¢é£ã®ã¡ããªã¯ã¹ã¯ãããŒã ãæœåšçãªã»ãã¥ãªãã£ãªã¹ã¯ãç¹å®ããŠè»œæžããã®ã«åœ¹ç«ã¡ãŸãã
- éçºå¹çã®åäžïŒ ã³ãŒãåè³ªã®æç¢ºãªå šäœåãæäŸããããšã«ãããããã·ã¥ããŒãã¯ãããŒã ãæã泚æãå¿ èŠãªé åã«åŽåãéäžãããéçºãµã€ã¯ã«ãé«éåãããã°ãæžããã®ã«åœ¹ç«ã¡ãŸãã
- ããŒã¿ã«åºã¥ããæææ±ºå®ïŒ ããã·ã¥ããŒãã¯ãé²è¡ç¶æ³ã远跡ããã³ãŒã倿Žã®åœ±é¿ãè©äŸ¡ããã³ãŒãåè³ªã®æ¹åã«ã€ããŠæ å ±ã«åºã¥ããæææ±ºå®ãè¡ãããã«äœ¿çšã§ãã客芳çãªããŒã¿ãæäŸããŸãã
- ããŒã ã³ã©ãã¬ãŒã·ã§ã³ã®åäžïŒ å ±æããã·ã¥ããŒãã¯ãããŒã ã¡ã³ããŒéã®éææ§ãšã³ã©ãã¬ãŒã·ã§ã³ãä¿é²ããã³ãŒãå質ã®è²¬ä»»ãè² ããäžç·ã«æ¹åã«åãçµãããã«ä¿ããŸãã
JavaScriptã³ãŒãå質ããã·ã¥ããŒãã§è¿œè·¡ããäž»ãªã¡ããªã¯ã¹
ããã·ã¥ããŒãã§è¿œè·¡ããå ·äœçãªã¡ããªã¯ã¹ã¯ããããžã§ã¯ãã®ããŒãºãšç®æšã«ãã£ãŠç°ãªããŸãããã ããããã€ãã®äžè¬çã§äžå¯æ¬ ãªã¡ããªã¯ã¹ã«ã¯ä»¥äžãå«ãŸããŸãã
1. ã³ãŒãã«ãã¬ããž
ã³ãŒãã«ãã¬ããžã¯ãèªåãã¹ãã§ã«ããŒãããã³ãŒãããŒã¹ã®å²åãæž¬å®ããŸããããã¯ããã¹ãæŠç¥ã®åŸ¹åºåºŠã«é¢ããæŽå¯ãæäŸããé©åã«ãã¹ããããŠããªãå¯èœæ§ã®ããé åãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
- ã¹ããŒãã¡ã³ãã«ãã¬ããžïŒ ãã¹ãã«ãã£ãŠå®è¡ãããã³ãŒãå ã®ã¹ããŒãã¡ã³ãã®å²åã
- ãã©ã³ãã«ãã¬ããžïŒ ãã¹ãã«ãã£ãŠå®è¡ãããã³ãŒãå ã®ãã©ã³ãïŒäŸïŒif/elseã¹ããŒãã¡ã³ãïŒã®å²åã
- 颿°ã«ãã¬ããžïŒ ãã¹ãã«ãã£ãŠåŒã³åºãããã³ãŒãå ã®é¢æ°ã®å²åã
äŸïŒ ã¹ããŒãã¡ã³ãã«ãã¬ããžã80ïŒ ã®ãããžã§ã¯ãã¯ããã¹ãäžã«ã³ãŒãã®80ïŒ ã®è¡ãå®è¡ãããããšãæå³ããŸããé«ãã³ãŒãã«ãã¬ããžãç®æãããšã¯äžè¬çã«è¯ãç¿æ £ã§ãããã«ãã¬ããžã ãã§ã¯ãã¹ãã®å質ãä¿èšŒã§ããªãããšãèŠããŠããããšãéèŠã§ãããã¹ãã¯é©åã«èšè¿°ãããéèŠãªãšããžã±ãŒã¹ãã«ããŒããå¿ èŠããããŸãã
2. 埪ç°çè€é床
埪ç°çè€é床ã¯ãããã°ã©ã ã®ãœãŒã¹ã³ãŒããä»ããç·åœ¢çã«ç¬ç«ãããã¹ã®æ°ã枬å®ããŸããããã¯ãã³ãŒãã®è€éããšãçè§£ãšä¿å®ã«å¿ èŠãªåŽåã瀺ããã®ã§ããé«ã埪ç°çè€é床ã¯ããã¹ããé£ããããšã©ãŒãçºçããããã³ãŒãã§ããããšããã瀺ãããŸãã
äŸïŒ 埪ç°çè€é床ã1ã®é¢æ°ã¯ãã³ãŒããä»ãããã¹ã1ã€ã ãã§ãïŒäŸïŒåçŽãªã¹ããŒãã¡ã³ãã®ã·ãŒã±ã³ã¹ïŒã埪ç°çè€é床ã5ã®é¢æ°ã«ã¯5ã€ã®ç¬ç«ãããã¹ããããããè€éãªå¶åŸ¡ãããŒã瀺ããŸããäžè¬çã«ã埪ç°çè€é床ã10ãè¶ ãã颿°ã¯ãæ³šææ·±ãã¬ãã¥ãŒããæœåšçã«ãªãã¡ã¯ã¿ãªã³ã°ããå¿ èŠããããŸãã
3. ã³ãŒãã®éè€
ã³ãŒãã®éè€ïŒã³ãŒãã¯ããŒã³ãšãåŒã°ããŸãïŒã¯ãåããŸãã¯éåžžã«é¡äŒŒããã³ãŒããã³ãŒãããŒã¹ã®è€æ°ã®å Žæã«çŸããå Žåã«çºçããŸããéè€ããã³ãŒãã¯ããã°ã®ãªã¹ã¯ãå¢å ãããã³ãŒãã®ä¿å®ãå°é£ã«ããççŸãåŒãèµ·ããå¯èœæ§ããããŸããã³ãŒãã®éè€ãç¹å®ããŠæé€ããããšã¯ãã³ãŒãå質ãåäžãããããã®éèŠãªã¹ãããã§ãã
äŸïŒ 10è¡ã®åããããã¯ã®ã³ãŒãã3ã€ã®ç°ãªã颿°ã§ç¹°ãè¿ãããŠããå Žåãããã¯ã³ãŒãã®éè€ã衚ããŸããã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããŠãéè€ããããžãã¯ãåå©çšå¯èœãªé¢æ°ã«æœåºãããšãä¿å®æ§ãå€§å¹ ã«åäžãããããšãã§ããŸãã
4. ã³ãŒãã®èã
ã³ãŒãã®èãã¯ãã³ãŒãã®ããæ·±ãåé¡ã®è¡šé¢çãªå åã§ãããããã¯å¿ ããããã°ã§ã¯ãããŸããããèšèšäžã®éžæãã¹ãæªãã³ãŒãã£ã³ã°ãã©ã¯ãã£ã¹ã瀺ãå¯èœæ§ããããŸããäžè¬çãªã³ãŒãã®èãã®äŸã«ã¯ã次ã®ãããªãã®ããããŸãã
- é·ãã¡ãœãã/颿°ïŒ é·ãããŠè€éãªé¢æ°ã
- 倧ããªã¯ã©ã¹ïŒ 責任ãå€ãããã¯ã©ã¹ã
- éè€ããã³ãŒãïŒ è€æ°ã®å Žæã§ç¹°ãè¿ãããã³ãŒãã
- æ æ°ãªã¯ã©ã¹ïŒ ã»ãšãã©äœãè¡ããªãã¯ã©ã¹ã
- ããŒã¿å¡ïŒ é »ç¹ã«äžç·ã«è¡šç€ºãããããŒã¿ã®ã°ã«ãŒãã
äŸïŒ ããŸããŸãªã¿ã¹ã¯ãå€ãå®è¡ãã颿°ã¯ãé·ãã¡ãœãããšèŠãªãããšãã§ããŸãã颿°ãããå°ãããããçŠç¹ãçµã£ã颿°ã«åå²ãããšãå¯èªæ§ãšä¿å®æ§ãåäžããŸãã
5. ã»ãã¥ãªãã£ã®è匱æ§
ã»ãã¥ãªãã£ã®è匱æ§ã¯ãæ»æè ãã¢ããªã±ãŒã·ã§ã³ã䟵害ããããã«æªçšã§ããã³ãŒãã®æ¬ é¥ã§ããã»ãã¥ãªãã£ã®è匱æ§ã远跡ããããšã¯ãæ»æããã¢ããªã±ãŒã·ã§ã³ãä¿è·ããããã«äžå¯æ¬ ã§ããJavaScriptã¢ããªã±ãŒã·ã§ã³ã«ãããäžè¬çãªçš®é¡ã®ã»ãã¥ãªãã£ã®è匱æ§ã«ã¯ã次ã®ãããªãã®ããããŸãã
- ã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒXSSïŒïŒ æªæã®ããã¹ã¯ãªãããã¢ããªã±ãŒã·ã§ã³ã«æ³šå ¥ããæ»æã
- SQLã€ã³ãžã§ã¯ã·ã§ã³ïŒ æªæã®ããSQLã³ãŒããããŒã¿ããŒã¹ã¯ãšãªã«æ³šå ¥ããæ»æã
- ã¯ãã¹ãµã€ããªã¯ãšã¹ããã©ãŒãžã§ãªïŒCSRFïŒïŒ ãŠãŒã¶ãŒã«æå³ããªãã¢ã¯ã·ã§ã³ãå®è¡ãããæ»æã
- ãããã¿ã€ãæ±æïŒ JavaScriptãããã¿ã€ããæäœããŠãã¢ããªã±ãŒã·ã§ã³ã®åäœã«åœ±é¿ãäžããå¯èœæ§ã®ããããããã£ãšã¡ãœãããæ³šå ¥ããã
- äŸåé¢ä¿ã®è匱æ§ïŒ ã¢ããªã±ãŒã·ã§ã³ã䜿çšãããµãŒãããŒãã£ã©ã€ãã©ãªãšãã¬ãŒã ã¯ãŒã¯ã®è匱æ§ã
äŸïŒ è匱ãªããŒãžã§ã³ã®äžè¬çãªJavaScriptã©ã€ãã©ãªã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ãæ¢ç¥ã®ã»ãã¥ãªãã£ãšã¯ã¹ããã€ãã«ãããããå¯èœæ§ããããŸããäŸåé¢ä¿ã®è匱æ§ã宿çã«ã¹ãã£ã³ããææ°ããŒãžã§ã³ã«æŽæ°ããããšã¯ãéèŠãªã»ãã¥ãªãã£ãã©ã¯ãã£ã¹ã§ãã
6. æè¡çè² åµ
æè¡çè² åµã¯ãæéããããããè¯ãã¢ãããŒãã䜿çšãã代ããã«ãä»ããç°¡åãªè§£æ±ºçãéžæããããšã«ãã£ãŠåŒãèµ·ãããããåäœæ¥ã®æç€ºçãªã³ã¹ãã衚ããŸãããœãããŠã§ã¢éçºã§ã¯ãããçšåºŠã®æè¡çè² åµã¯é¿ããããŸãããããããèç©ããŠãããžã§ã¯ãã®ä¿å®æ§ãšã¹ã±ãŒã©ããªãã£ã«æªåœ±é¿ãåãŒããªãããã«ã远跡ããŠç®¡çããããšãéèŠã§ãã
äŸïŒ ç· ãåãã«éã«åãããããã«ãè¿ éã§ããããªåé¿çã䜿çšããããšãéžæãããšãæè¡çè² åµãçºçããå¯èœæ§ããããŸããåŸã§åé¿çãææžåããã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããæéãã¹ã±ãžã¥ãŒã«ãããšããã®è² åµã管çããã®ã«åœ¹ç«ã¡ãŸãã
7. ä¿å®æ§ææ°
ä¿å®æ§ææ°ïŒMIïŒã¯ããœãããŠã§ã¢ãä¿å®ãã容æããå®éåããããšããè€åã¡ããªã¯ã¹ã§ããéåžžã埪ç°çè€é床ãã³ãŒãéãHalsteadããªã¥ãŒã ãªã©ã®èŠçŽ ãèæ ®ãããŸããMIã¹ã³ã¢ãé«ãã»ã©ãäžè¬çã«ã³ãŒãã®ä¿å®æ§ãé«ããªããŸãã
äŸïŒ 100ã«è¿ãMIã¹ã³ã¢ã¯ãéåžžã«ä¿å®æ§ã®é«ãã³ãŒãã瀺ãã0ã«è¿ãã¹ã³ã¢ã¯ãä¿å®ãé£ããã³ãŒãã瀺ããŸãã
8. ã³ãŒãè¡æ°ïŒLOCïŒ
å質ã®çŽæ¥çãªææšã§ã¯ãããŸããããã³ãŒãè¡æ°ã¯ãä»ã®ã¡ããªã¯ã¹ãåæããéã«ã³ã³ããã¹ããæäŸã§ããŸããããšãã°ã埪ç°çè€é床ã®é«ã倧ããªé¢æ°ã¯ãåãè€é床ã®å°ããªé¢æ°ãããæžå¿µäºé ã§ãã
äŸïŒ ç°ãªãã¢ãžã¥ãŒã«ã®LOCãæ¯èŒãããšããªãã¡ã¯ã¿ãªã³ã°ãŸãã¯ã³ãŒãåå²ããæ©æµãåããå¯èœæ§ã®ããé åãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
JavaScriptã³ãŒãå質ããã·ã¥ããŒãã®æ§ç¯
JavaScriptã³ãŒãå質ããã·ã¥ããŒããæ§ç¯ããã«ã¯ãããã€ãã®æ¹æ³ããããŸãã
1. SonarQubeã®äœ¿çš
SonarQubeã¯ãã³ãŒãå質ã®ç¶ç¶çãªæ€æ»ã«åºã䜿çšãããŠãããªãŒãã³ãœãŒã¹ãã©ãããã©ãŒã ã§ããJavaScriptãå«ãå¹ åºãããã°ã©ãã³ã°èšèªããµããŒãããŠãããã³ãŒãå質ã¡ããªã¯ã¹ã®å æ¬çãªåæãæäŸããŸãã
JavaScriptãããžã§ã¯ãã«SonarQubeãçµ±åããæé ïŒ
- SonarQubeã®ã€ã³ã¹ããŒã«ãšæ§æïŒ SonarQubeãµãŒããŒãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ãããããžã§ã¯ãã®ãªããžããªã«æ¥ç¶ããããã«æ§æããŸãã
- SonarScannerã®ã€ã³ã¹ããŒã«ïŒ ã³ãŒããåæããŠçµæãSonarQubeãµãŒããŒã«éä¿¡ããããã«äœ¿çšãããSonarScannerã³ãã³ãã©ã€ã³ããŒã«ãã€ã³ã¹ããŒã«ããŸãã
- SonarScannerã®æ§æïŒ ãããžã§ã¯ãã®è©³çްã䜿çšããŠSonarScannerãæ§æããããã«ããããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«`sonar-project.properties`ãã¡ã€ã«ãäœæããŸãã
- åæã®å®è¡ïŒ SonarScannerã³ãã³ããå®è¡ããŠãã³ãŒããåæããŸãã
- çµæã®è¡šç€ºïŒ SonarQube Webã€ã³ã¿ãŒãã§ã€ã¹ã«ã¢ã¯ã»ã¹ããŠãåæçµæã衚瀺ããã³ãŒãå質ã¡ããªã¯ã¹ã远跡ããŸãã
äŸ`sonar-project.properties`ãã¡ã€ã«ïŒ
sonar.projectKey=my-javascript-project
sonar.projectName=My JavaScript Project
sonar.projectVersion=1.0
sonar.sources=src
sonar.javascript.linter.eslint.reportPaths=eslint-report.json
sonar.javascript.jstest.reportsPath=coverage/lcov.info
2. ESLintããã³ãã®ä»ã®ãªã³ã¿ãŒã®äœ¿çš
ESLintã¯ãã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ã«é¢ããåé¡ãæœåšçãªãšã©ãŒãããã³ã³ãŒãã®èããç¹å®ããŠä¿®æ£ããã®ã«åœ¹ç«ã€ãäžè¬çãªJavaScriptãªã³ã¿ãŒã§ããJSHintãStandardJSãªã©ã®ä»ã®ãªã³ã¿ãŒã䜿çšã§ããŸãã
ãããžã§ã¯ãã«ESLintãçµ±åããæé ïŒ
- ESLintã®ã€ã³ã¹ããŒã«ïŒ npmãŸãã¯yarnã䜿çšããŠããããžã§ã¯ãã®éçºäŸåé¢ä¿ãšããŠESLintãã€ã³ã¹ããŒã«ããŸãïŒ`npm install --save-dev eslint`ãŸãã¯`yarn add --dev eslint`ã
- ESLintã®æ§æïŒ ãããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«`.eslintrc.js`ãŸãã¯`.eslintrc.json`ãã¡ã€ã«ãäœæããŠãESLintã奜ã¿ã®ã«ãŒã«ã§æ§æããŸãã
- ESLintã®å®è¡ïŒ ESLintãå®è¡ããŠãã³ãŒããåæããŸãïŒ`eslint .`
- ESLintã®èªååïŒ ESLintããã«ãããã»ã¹ãŸãã¯IDEã«çµ±åããŠãåé¡ãèªåçã«ãã§ãã¯ããŸãã
äŸ`.eslintrc.js`ãã¡ã€ã«ïŒ
module.exports = {
env: {
browser: true,
es2021: true,
node: true,
},
extends: [
'eslint:recommended',
'plugin:react/recommended',
],
parserOptions: {
ecmaFeatures: {
jsx: true,
},
ecmaVersion: 12,
sourceType: 'module',
},
plugins: [
'react',
],
rules: {
'no-unused-vars': 'warn',
'no-console': 'warn',
'react/prop-types': 'off',
},
};
ESLintçµæã®å¯èŠåïŒ ESLintããã¬ããŒããçæããããã·ã¥ããŒãã«è¡šç€ºã§ããŸãã`eslint-json`ãªã©ã®ããŒã«ã¯ãESLintåºåãå¯èŠåã«é©ããJSON圢åŒã«å€æããã®ã«åœ¹ç«ã¡ãŸãã
3. ã³ãŒãã«ãã¬ããžããŒã«ã®äœ¿çš
IstanbulïŒnycïŒãMochaãªã©ã®ããŒã«ã䜿çšããŠãJavaScriptãã¹ãã®ã³ãŒãã«ãã¬ããžã¬ããŒããçæã§ããŸãã
ã³ãŒãã«ãã¬ããžã¬ããŒããçæããæé ïŒ
- ã³ãŒãã«ãã¬ããžããŒã«ã®ã€ã³ã¹ããŒã«ïŒ IstanbulãŸãã¯å¥ã®ã³ãŒãã«ãã¬ããžããŒã«ãéçºäŸåé¢ä¿ãšããŠã€ã³ã¹ããŒã«ããŸãã
- ãã¹ãã©ã³ããŒã®æ§æïŒ ã³ãŒãã«ãã¬ããžããŒã«ã䜿çšããããã«ãã¹ãã©ã³ããŒïŒäŸïŒMochaãJestïŒãæ§æããŸãã
- ãã¹ãã®å®è¡ïŒ ãã¹ããå®è¡ããŠãã³ãŒãã«ãã¬ããžã¬ããŒããçæããŸãã
- ã¬ããŒãã®å¯èŠåïŒ `lcov-reporter`ãªã©ã®ããŒã«ã䜿çšããŠãã³ãŒãã«ãã¬ããžã®çµæãå¯èŠåããHTMLã¬ããŒããçæããŸãã
JestãšIstanbulã䜿çšããäŸïŒ
// package.json
{
"scripts": {
"test": "jest --coverage"
}
}
4. ã«ã¹ã¿ã ããã·ã¥ããŒãã®æ§ç¯
ããŒã«ãšãã¯ããã¯ã®çµã¿åããã䜿çšããŠãã«ã¹ã¿ã ããã·ã¥ããŒããæ§ç¯ããããšãã§ããŸãã
- ããŒã¿åéïŒ ESLintãã³ãŒãã«ãã¬ããžããŒã«ãããã³ãã®ä»ã®éçåæããŒã«ã䜿çšããŠãã³ãŒãå質ã¡ããªã¯ã¹ãåéããŸãã
- ããŒã¿ã¹ãã¬ãŒãžïŒ åéãããããŒã¿ãããŒã¿ããŒã¹ãŸãã¯ãã¡ã€ã«ã·ã¹ãã ã«ä¿åããŸãã
- ããŒã¿ã®å¯èŠåïŒ Chart.jsãD3.jsããŸãã¯Highchartsãªã©ã®ã°ã©ãäœæã©ã€ãã©ãªã䜿çšããŠãã³ãŒãå質ã¡ããªã¯ã¹ãå¯èŠåããã€ã³ã¿ã©ã¯ãã£ããªãã£ãŒããšã°ã©ããäœæããŸãã
- ããã·ã¥ããŒããã¬ãŒã ã¯ãŒã¯ïŒ ReactãAngularããŸãã¯Vue.jsãªã©ã®ããã·ã¥ããŒããã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãããã·ã¥ããŒãã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãæ§ç¯ããŸãã
Chart.jsãšReactã䜿çšããäŸïŒ
// React component
import React, { useEffect, useRef } from 'react';
import Chart from 'chart.js/auto';
const CodeCoverageChart = ({ coverageData }) => {
const chartRef = useRef(null);
useEffect(() => {
const chartCanvas = chartRef.current.getContext('2d');
new Chart(chartCanvas, {
type: 'bar',
data: {
labels: ['Statements', 'Branches', 'Functions', 'Lines'],
datasets: [{
label: 'Coverage %',
data: [coverageData.statements, coverageData.branches, coverageData.functions, coverageData.lines],
backgroundColor: ['rgba(255, 99, 132, 0.2)', 'rgba(54, 162, 235, 0.2)', 'rgba(255, 206, 86, 0.2)', 'rgba(75, 192, 192, 0.2)'],
borderColor: ['rgba(255, 99, 132, 1)', 'rgba(54, 162, 235, 1)', 'rgba(255, 206, 86, 1)', 'rgba(75, 192, 192, 1)'],
borderWidth: 1,
}],
},
options: {
scales: {
y: {
beginAtZero: true,
max: 100,
},
},
},
});
}, [coverageData]);
return ; // Use a React Fragment
};
export default CodeCoverageChart;
æéã®çµéã«äŒŽãåŸåã®å¯èŠå
ã³ãŒãå質ããã·ã¥ããŒãã®éèŠãªå©ç¹ã¯ãæéã®çµéã«äŒŽãåŸåã远跡ã§ããããšã§ããããã«ããããããžã§ã¯ããé²ãã«ã€ããŠãã³ãŒãå質ãåäžãŸãã¯äœäžããŠããããšã確èªã§ããŸããåŸåãå¯èŠåããã«ã¯ãå±¥æŽããŒã¿ãä¿åããã¡ããªã¯ã¹ãæéã®çµéãšãšãã«ã©ã®ããã«å€åãããã瀺ããã£ãŒããäœæããå¿ èŠããããŸãã
äŸïŒ éå»1幎éã®ç¹å®ã®ã¢ãžã¥ãŒã«ã®åŸªç°çè€é床ã瀺ãæãç·ã°ã©ããäœæããŸããè€é床ãå¢å ããŠããå Žåã¯ãã¢ãžã¥ãŒã«ã®ãªãã¡ã¯ã¿ãªã³ã°ãå¿ èŠã«ãªãå¯èœæ§ããããŸãã
å®çšçãªæŽå¯ãšæšå¥šäºé
ã³ãŒãå質ããã·ã¥ããŒãã¯ãå®çšçãªæŽå¯ãšæšå¥šäºé ã«ã€ãªããå Žåã«ã®ã¿åœ¹ç«ã¡ãŸããããã·ã¥ããŒãã¯ã远跡ãããŠããã¡ããªã¯ã¹ã«åºã¥ããŠãã³ãŒãåè³ªãæ¹åããæ¹æ³ã«é¢ããæç¢ºãªã¬ã€ãã³ã¹ãæäŸããå¿ èŠããããŸãã
å®çšçãªæŽå¯ã®äŸïŒ
- äœãã³ãŒãã«ãã¬ããžïŒ ç¹å®ã®ã¢ãžã¥ãŒã«ãŸãã¯é¢æ°ã®ãã¹ãã«ãã¬ããžãå¢ãããŸãã
- é«ã埪ç°çè€éåºŠïŒ è€éãªé¢æ°ããªãã¡ã¯ã¿ãªã³ã°ããŠãè€éåºŠãæžãããŸãã
- ã³ãŒãã®éè€ïŒ éè€ããã³ãŒããåå©çšå¯èœãªé¢æ°ã«æœåºããŸãã
- ã»ãã¥ãªãã£ã®è匱æ§ïŒ è匱ãªäŸåé¢ä¿ãæŽæ°ããããã³ãŒãã®ã»ãã¥ãªãã£äžã®æ¬ é¥ãä¿®æ£ããŸãã
ã³ãŒãå質ããã·ã¥ããŒããç¶æããããã®ãã¹ããã©ã¯ãã£ã¹
ã³ãŒãå質ããã·ã¥ããŒãã广çã«ç¶æããã«ã¯ã次ã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããã
- åæãèªååããïŒ ãã«ãããã»ã¹ã«ã³ãŒãå質åæãçµ±åããŠãã³ãŒãã倿Žããããã³ã«ã¬ããŒããèªåçã«çæããŸãã
- ç®æšãšã¿ãŒã²ãããèšå®ããïŒ ã³ãŒãå質ã¡ããªã¯ã¹ã®å ·äœçãªç®æšãšã¿ãŒã²ãããå®çŸ©ããŠãé²è¡ç¶æ³ã远跡ããæåãæž¬å®ããŸãã
- ããã·ã¥ããŒãã宿çã«ã¬ãã¥ãŒããïŒ ããã·ã¥ããŒãã®å®æçãªã¬ãã¥ãŒãã¹ã±ãžã¥ãŒã«ããŠãåé¡ç¹ã確èªããç®æšãžã®é²æç¶æ³ã远跡ããŸãã
- çµæãäŒããïŒ ããã·ã¥ããŒããéçºããŒã ããã³ã¹ããŒã¯ãã«ããŒãšå ±æããŠãéææ§ãšã³ã©ãã¬ãŒã·ã§ã³ãä¿é²ããŸãã
- ç¶ç¶çã«æ¹åããïŒ ããã·ã¥ããŒããç¶ç¶çã«è©äŸ¡ããã³æ¹åããŠãæãé¢é£æ§ã®é«ãå®çšçãªæ å ±ãæäŸã§ããããã«ããŸãã
çµè«
JavaScriptã³ãŒãå質ããã·ã¥ããŒãã¯ãã³ãŒãããŒã¹ã®å質ãä¿å®æ§ãã»ãã¥ãªãã£ãåäžãããããã®éåžžã«è²ŽéãªããŒã«ã§ããäž»èŠãªã¡ããªã¯ã¹ã远跡ãããã¬ã³ããå¯èŠåããå®çšçãªæŽå¯ãæäŸããããšã«ãããé©åã«èšèšãããããã·ã¥ããŒãã¯ãããŒã ãããè¯ããœãããŠã§ã¢ãããéãæ§ç¯ããã®ã«åœ¹ç«ã¡ãŸããSonarQubeã®ãããªãã©ãããã©ãŒã ã䜿çšããããšãéžæããå Žåã§ãããªã³ã¿ãŒãšã³ãŒãã«ãã¬ããžããŒã«ã掻çšããããšãéžæããå Žåã§ããã«ã¹ã¿ã ããã·ã¥ããŒããæ§ç¯ããããšãéžæããå Žåã§ããéèŠãªã®ã¯ãã³ãŒãå質åæãéçºããã»ã¹ã«çµ±åããç¶ç¶çãªåªåã«ããããšã§ãã